#ifndef UI_HPP
#define UI_HPP

#include <exception>
#include <string>
#include "ReadMixture.hpp"
#include "Mixer.hpp"
#include "MarkerUnifier.hpp"
#include "Assertions.hpp"
#include "common.hpp"
#include "ProfileGenerator.hpp"
#include "ParseException.hpp"
#include "gtest/gtest_prod.h"

namespace ui
{
//User Interface
class UInt
{
public:
	UInt();
	~UInt();
	//Start interface method
	int StartInterface();
	//Mix- mixture file, pro-profile files, out- catalogue for output
	int StartInterface(std::string mix, std::string pro, std::string out, int threads,int howmanypeople);
	//int StartInterface(std::string mix, std::string pro1, std::string pro2, std::string out, int threads);
	//generate
	int StartInterface(std::string mix, int howman, std::string out, int threads);
private:
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith3MarkersTwoPeople);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith3MarkersThreePeople);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith3MarkersThreePeopleBetterMixture);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith5MarkersTwoPeople);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith5MarkersThreePeople);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith5MarkersThreePeopleBetterMixture);
	FRIEND_TEST(UInt, shouldFindMissingProfilesWith10MarkersTwoPeople);
	FRIEND_TEST(UInt, DISABLED_shouldFindMissingProfilesWith10MarkersThreePeople);
	FRIEND_TEST(UInt, DISABLED_shouldFindMissingProfilesWith10MarkersThreePeopleBetterMixture);
	bool UnifyAndMix(const std::vector<dna::marker>& mixture, int threads, generator::outputPtr);
	bool UnifyAndMixMarker(const dna::marker& mixture, int threads, std::list<dna::genotypeSet>& results);
	
	FRIEND_TEST(UInt, shouldGenerateAllPossibleProfilesWith3MarkersTwoPeople);
	FRIEND_TEST(UInt, shouldGenerateAllPossibleProfilesWith3MarkersThreePeople);
	FRIEND_TEST(UInt, shouldGenerateAllPossibleProfilesWith3MarkersThreePeopleBetterMixture);
	FRIEND_TEST(UInt, shouldGenerateAllPossibleProfilesWith5MarkersTwoPeople);
	FRIEND_TEST(UInt, DISABLED_shouldGenerateAllPossibleProfilesWith5MarkersThreePeople);
	FRIEND_TEST(UInt, DISABLED_shouldGenerateAllPossibleProfilesWith5MarkersThreePeopleBetterMixture);
	FRIEND_TEST(UInt, shouldGenerateAllPossibleProfilesWith5Markers4Threads);
	FRIEND_TEST(UInt, DISABLED_shouldGenerateAllPossibleProfilesWith10MarkersTwoPeople);
	FRIEND_TEST(UInt, DISABLED_shouldGenerateAllPossibleProfilesWith10MarkersThreePeople);
	FRIEND_TEST(UInt, DISABLED_shouldGenerateAllPossibleProfilesWith10MarkersThreePeopleBetterMixture);
	FRIEND_TEST(UInt, shouldReturnOnlyOneProfileWhenGivenSpecificProfileToRemoveFromTwoPeopleMixture);
	std::vector<std::vector<dna::profile>> pros;
	bool UnifyMixRemove(const std::vector<dna::marker>& mixture,const dna::profile& profileToRemove, int threads, generator::outputPtr);
	bool UnifyMixRemoveMarker(const dna::marker& marker,const std::vector<dna::allel>& profiles, int threads, std::list<dna::genotypeSet>& results);
	int howManyPeople;
	bool checkCoverage(const std::vector<dna::marker>& mixture, const dna::profile & profiles,int howManyPeople);
	
};



}//namespace ui
#endif /* UI_HPP */
